/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.edinet.agencialinea3.ejb.facade;

import cl.aperture.commons.DatoFecha;
import cl.aperture.commons.ValidationException;
import cl.edinet.agencialinea3.ejb.bean.parametro.ParametroDeclaracion;
import cl.edinet.agencialinea3.ejb.entity.Declaracion;
import cl.edinet.agencialinea3.ejb.entity.Importador;
import cl.edinet.agencialinea3.ejb.entity.TipoOperacion;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author Iván Zúñiga & Tomás Quinteros
 */
@Stateless
public class DeclaracionFacade extends AbstractFacade<Declaracion> {

    @PersistenceContext(unitName = "AgenciaLinea3-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public DeclaracionFacade() {
        super(Declaracion.class);
    }

    public int contarByFiltros(ParametroDeclaracion parametroDeclaracion) throws ValidationException {

        return ((Long) buildQuery(parametroDeclaracion, true).getSingleResult()).intValue();

    }

    public List<Declaracion> findAllByParametros(ParametroDeclaracion parametrosMovimientos) throws ValidationException {
        List<Declaracion> resultList = buildQuery(parametrosMovimientos, false).getResultList();
        if (resultList != null) {
            if (parametrosMovimientos.isIncludeGuiasDespachos()) {
                for (Declaracion declaracion : resultList) {
                    declaracion.getGuiasDespachoList().size();
                }
            }
        }
        return resultList;
    }

    public Declaracion getDeclaracionByNumeroDespacho(BigDecimal numeroDespacho, boolean isIncluideItems) {
        Declaracion declaracion = (Declaracion) getEntityManager().createNativeQuery("select * from declaracion where numero_despacho=" + numeroDespacho, Declaracion.class).getSingleResult();

        if (isIncluideItems) {
            declaracion.getItemsList().size();
        }

        return declaracion;

    }

    public Query buildQuery(ParametroDeclaracion parametroDeclaracion, boolean isContar) throws ValidationException {

        Importador importador = parametroDeclaracion.getImportador();
        DatoFecha fechaAceptacionDesde = parametroDeclaracion.getFechaAceptacionDesde();
        DatoFecha fechaAceptacionHasta = parametroDeclaracion.getFechaAceptacionHasta();
        TipoOperacion tipoOperacion = parametroDeclaracion.getTipoOperacion();
        
        if(importador==null){
            throw new ValidationException("Falta el importador");
        }

        List<String> where = new ArrayList<String>();

        boolean isParametroFechaDesde = false;
        boolean isParametroFechaHasta = false;

        String sql = "";

        if (isContar) {
            sql = "select count(d.numeroDespacho) from Declaracion d ";
        } else {
            sql = "select d from Declaracion d ";
        }


        if (importador != null) {
            where.add("d.importador.codigo = " + importador.getCodigo());
        }
        if (fechaAceptacionDesde != null) {
            where.add("d.fechaAceptacion >= :fechaAceptacionDesde");
            isParametroFechaDesde = true;
        }
        if (fechaAceptacionHasta != null) {
            where.add("d.fechaAceptacion <= :fechaAceptacionHasta");
            isParametroFechaHasta = true;
        }
        if (tipoOperacion != null) {
            where.add("d.tipoOperacion.codigo = " + tipoOperacion.getCodigo());
        }

        if (!where.isEmpty()) {
            sql += " where " + StringUtils.join(where, " and ") + " ";
        }

        Query query;

        if (isContar) {
            query = getEntityManager().createQuery(sql);
        } else {
            query = getEntityManager().createQuery(sql, Declaracion.class);
            query.setFirstResult(parametroDeclaracion.getRegistrosDesde());
            query.setMaxResults(parametroDeclaracion.getCantidadRegistrosPorPagina());

        }

        if (isParametroFechaDesde) {
            query.setParameter("fechaAceptacionDesde", parametroDeclaracion.getFechaAceptacionDesde().getDate());
        }
        if (isParametroFechaHasta) {
            query.setParameter("fechaAceptacionHasta", parametroDeclaracion.getFechaAceptacionHasta().getDate());
        }

        return query;

    }
}
